Sponsored Content
Full Discussion: Lseek implementation
Top Forums UNIX for Dummies Questions & Answers Lseek implementation Post 302554957 by Corona688 on Tuesday 13th of September 2011 01:16:15 PM
Old 09-13-2011
Quote:
Originally Posted by Humudituu
I'm trying to wrap my mind around this... The mutex should be released after the lseek, right? Is the mutex active while writing? Otherwise the behaviour explanied below wouldn't make sense to me, as either lseek while reading would be slow as well or the mutex should be released rather quickly... :S
I suspect reads are happening faster than writes because a disk has its own internal cache, too.

That mutex must control more than just the a offset...

On thinking about this a little more, I think this happens because POSIX requires the ordering of some block operations to be preserved. It's pretty much just common-sense rules, like if one program reads a block after another writes to it, the reading program should get the new contents and not the old.

Forcing things to go in order is easy when you have cache. Just keep the cache consistent and everything's golden. Things don't have to wait for each other. Reads still happen randomly as needed, while disk writes happen in orderly groups, at times of the kernel's own choosing. ext2/3/4 are designed for this mode of operation.

When you switch to direct I/O, writes must happen in lock-step for consistency to be preserved. The order of reads doesn't matter as much.

I suspect you'd get better performance by writing to a raw disk device instead of a file on disk. That's the context I usually see O_DIRECT employed in.

Last edited by Corona688; 09-13-2011 at 02:27 PM..
 

10 More Discussions You Might Find Interesting

1. Programming

lseek in c

sir, i used lssek as this lseek(fp,-10,2); i am not getting any output i dont now why can you explan sir.. Thanks in advance, Arunkumar (4 Replies)
Discussion started by: arunkumar_mca
4 Replies

2. Shell Programming and Scripting

Need help on AWK implementation

Hi, I am accepting a string from user. compare this output with the awk output as below... echo "\n\n\tDay : \c" read day awk '{ if($day == $2) { if ($mon == $1) { print "Yes" }}}' syslog.txt I am getting the follwoing error awk: Field $() is not correct. The input line... (5 Replies)
Discussion started by: EmbedUX
5 Replies

3. Programming

Hairy Problem! lseek over 4G

recently my project needs me to lseek a position over 4G size.... i found in linux or unix the parameters are all ulong 32 bits...the limit dooms the movement of a position over 4G I was told that i should lseek64 to meet my need... but i have no idea where i can get the function neither by "man... (8 Replies)
Discussion started by: macroideal
8 Replies

4. Programming

Malloc implementation in C

Hey Guys I am trying to implement the malloc function for my OS class and I am having a little trouble with it. I would be really grateful if I could get some hints on this problem. So I am using a doubly-linked list as my data structure and I have to allocate memory for it (duh...). The... (1 Reply)
Discussion started by: Gambit_b
1 Replies

5. UNIX for Advanced & Expert Users

Malloc Implementation in C

Hey Guys Some of my friends have got together and we are trying to write a basic kernel similar to Linux. I am trying to implement the malloc function in C and I am using a doubly linked list as the primary data structure. I need to allocate memory for this link list (duh...) and I don't feel... (2 Replies)
Discussion started by: rbansal2
2 Replies

6. UNIX for Dummies Questions & Answers

lseek() equivalent

I know there is lseek() function that will allow to write or read from certain position in the file. Is there similar function that will let do same but for array rather then file? (9 Replies)
Discussion started by: joker40
9 Replies

7. UNIX for Dummies Questions & Answers

Understanding lseek

I tried to use lseek system call to determine the number of bytes in a file. To do so, I used open system call with O_APPEND flag to open a file. As lseek returns the current offset so I called lseek for opened file with offset as zero and whence as SEEK_CUR. So I guess it must return the number of... (3 Replies)
Discussion started by: Deepak Raj
3 Replies

8. Programming

what is the main difference between difference between using nonatomic lseek and O_APPEND

I think both write at the end of the file ...... but is there a sharp difference between those 2 instruction ..... thank you this is my 3rd question today forgive me :D (1 Reply)
Discussion started by: fwrlfo
1 Replies

9. AIX

Backup: The lseek call failed

Hi, We are facing issues while backing up our 1205 GB filesystem on LTO5 Tape. During backup the "backup: The lseek call failed." messages were generated, I want to know why these messages were generating AIX version is: 6100-08-00-0000 backup: The date of this level 0 backup is Mon Mar 11... (4 Replies)
Discussion started by: m_raheelahmed
4 Replies

10. Programming

Problem with lseek call.

The following code: int fd; if (fd = open("mem", O_RDONLY) == -1) return 1; if (lseek(fd, 0, SEEK_SET) == -1) { char *buf = malloc(512); buf = strerror(errno); printf("%s\n", buf); return 1; } always returns with "illegal seek"... (2 Replies)
Discussion started by: Sir_Tomasz
2 Replies
chvol(8)						      System Manager's Manual							  chvol(8)

NAME
chvol - changes the attributes of a volume SYNOPSIS
/sbin/chvol [-l] [-r blocks] [-w blocks] [-t blocks] [-c on | off] [-A] special domain OPTIONS
Activates a volume after an incomplete addvol or rmvol operation. Turns I/O consolidation mode on or off. Displays the range of I/O transfer sizes, in 512-byte blocks, as calculated by the kernel, based on the disk's geometry: rblks displays the minimum, the maximum, and the preferred transfer size for reads. wblks displays the minimum, the maximum, and the preferred transfer size for writes. Specifies the maximum number of 512-byte blocks that the file system reads from the disk at one time. Specifies the maximum number of dirty, 512-byte blocks that the file system will cache in-memory (per volume in a domain). Dirty means that the data has been written by the application but the file system has cached it in memory so it has not yet been written to disk. The number of blocks must be in multiples of 16. The valid range is 0-32768. The default (when a volume is added to a domain) is 16,384 blocks. For optimal performance, specify blocks in multiples of wblks (as specified by the -w option) and multiples of rblks (as specified by the -r option). Specifies the maximum number of 512-byte blocks that the file system writes to the disk at one time. OPERANDS
Specifies the block special device name, such as /dev/disk/dsk2c. Specifies the name of the file domain. DESCRIPTION
The chvol command enables you to change the attributes of a volume in an active domain. For example, the file system can consolidate a number of I/O transfers into a single, large I/O transfer. The larger the I/O transfer, the better the file-system performance. If you attempt to change the attributes of a volume in a domain that is not active, an error message is produced. The initial I/O transfer parameter for both reads and writes is typically 128 or 256 blocks, depending on the disk driver's preferred I/O transfer rate. Once you change the I/O transfer parameters with the -r option or the -w option, the parameters remain fixed until you change them again. The values for the I/O transfer parameters are limited by the device driver. Every device has a minimum and maximum value for the size of the reads and writes it can handle. If you set a value that is outside of the range that the device driver allows, the device automatically resets the value to the largest or smallest it can handle. By default, the I/O consolidation mode (cmode) is on. The cmode must be on for the I/O transfer parameters to take effect. You can use the -c option to turn the cmode off, which sets the I/O transfer parameter to one page. Interrupting an rmvol operation can leave the volume in an inaccessible state. If a volume does not allow new allocations after an rmvol operation, use the chvol command with the -A option to reactivate the volume. Using the chvol command without any options displays the current cmode and the I/O transfer parameters. RESTRICTIONS
The values for the wblks and rblks attributes are limited by the device driver. You must be the root user to use this command. EXAMPLES
The following example displays the cmode and the I/O transfer parameters of the /dev/disk/dsk1c volume in the domain1 file domain: # chvol /dev/disk/dsk1c domain1 rblks = 128 wblks = 128 cmode = on thresh = 16,384 The following example additionally toggles the cmode: # chvol -c off /dev/disk/dsk1c domain1 # chvol /dev/disk/dsk1c domain1 rblks = 128 wblks = 128 cmode = off thresh = 16,384 The following example continues by changing the I/O transfer parameters of reads (rblks) and writes (wblks) from 128 blocks to 256 blocks. Note that the cmode is off and must be on before the parameters take effect: # chvol -r 256 -w 256 -c on /dev/disk/dsk1c domain1 chvol /dev/disk/dsk1c domain1 rblks = 256 wblks = 256 cmode = on thresh = 16,384 The following example shows the I/O transfer range on domain1: # chvol -l /dev/disk/dsk0a domain1 chvol /dev/disk/dsk0a domain1 rblks: min = 16 max = 32768 pref = 256 wblks: min = 16 max = 32768 pref = 256 SEE ALSO
advfs(4), showfdmn(8) chvol(8)
All times are GMT -4. The time now is 01:19 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy