Tag: 操作系统

为什么fork系统调用奇怪的行为?

int main(void) { printf(“abc”); fork(); return 0; } 此代码的输出是: abcabc 为什么打印两次,即使fork系统调用在printf语句之后? Ideone链接

如何知道哪个进程分配内存?

我想知道进程分配内存的区域。 我知道我可以使用 cat /proc/pid/status 并且 cat /proc/zoneinfo 这两个命令都没有回答进程分配给内存的位置。 还有其他命令吗? 如果有可以在内核中实现它?

GDB跨越命令

我有以下C代码: #include #include #define SECTSIZE 512 #define ELFHDR ((struct Elf *)0x10000) // scratch space void readsect(void*, unit32_t); void readsec(uint32_t, uint32_t, uint32_t); void bootmain(void) { struct Proghdr *ph, *eph; // read 1st page off disk readseg((uint32_t) ELFHDR, SECTSIZE*8, 0); . . // REST OF CODE . } 我正在使用gdb介入我的代码,看看发生了什么。 我找到了bootmain 0x7d0a的地址,我在那里放了一个断点。 b *0x7d0a c 以上2个命令: b放置断点, c运行直到达到断点。 […]

fork()如何知道它是否在子进程和父进程中?

执行fork()系统调用时,处理器将进入内核模式。 因此,在fork调用结束时,生成了一个新进程,其中包含堆栈,用户数据和用户程序的副本。 那么fork如何在此时决定它是否在子进程中返回0并且如果它是主父进程那么它必须返回子进程的PID。 fork()被调用两次? 请解释。 我很迷惑 !!!

测量记忆的延迟

我正在经历这个链接 ,他们正在处理主存储器,L1和L2缓存的延迟的统计数据。 我想知道是否可以使用C / c ++代码计算相同而不使用基准测试工具?

驱动程序如何成为操作系统的一部分?

我知道操作系统内核是由驱动程序组成的,但驱动程序如何成为操作系统的一部分?内核是否自行反编译,然后添加驱动程序并重新编译自身?,或者是内核的驱动程序插件?,有人告诉我,对于大多数操作系统来说,驱动程序实际上已成为内核的一部分,但每当我编译ac程序时,它就变成了一个普通的可执行文件

execv如何从管道获取输出?

参考旧的作业问题: /* implementing “/usr/bin/ps -ef | /usr/bin/more” */使用管道/* implementing “/usr/bin/ps -ef | /usr/bin/more” */ #include #include #include int main() { int fds[2]; int child[2]; char *argv[3]; pipe(fds); if (fork()== 0) { close(fds[1]); close(STDIN_FILENO); dup(fds[0]); /* redirect standard input to fds[1] */ argv[0] = “/bin/more”; argv[1] = NULL; /* check how the argv array is set […]

为什么在使用fork系统调用时打印了很多PID?

我正在学习Linux中的进程管理,我尝试实现以下C程序,其输出打印了15个PID(4个唯一的PID)。 我试图找出进程族树,但它确实没有帮助我理解为什么PID被打印了这么多次。 我浏览了几个链接,包括http://u.cs.biu.ac.il/~linraz/os/OS2.pdf,http://www.ibm.com/developerworks/aix/library/au-unixprocess.html , 谁在fork()之后首先执行:父或孩子? 。 但是,我找不到解决方案。 如果有人帮助我理解这个问题,那将会很有帮助。 #include #include #include int main() { printf ( “Parent:%d Child: %d\n”,getppid(),getpid()); // To print the PIDs of the parent process and the child process fork(); //System call to spawn a child process printf ( “Parent:%d Child: %d\n”,getppid(),getpid()); fork(); printf ( “Parent:%d Child: %d\n”,getppid(),getpid()); fork(); printf ( “Parent:%d […]

测量Mutex和Busy等待的效率

该程序将创建多个线程,其中每个线程使用for循环将共享变量增加10000,在每次迭代中将其递增1。 需要互斥锁和自旋锁(忙等待)版本。 据我所知,互斥版本应该比自旋锁更快。 但我实施的内容给了我一个相反的答案…… 这是互斥锁版本中每个线程的实现: void *incr(void *tid) { int i; for(i = 0; i < 10000; i++) { pthread_mutex_lock(&the_mutex); //Grab the lock sharedVar++; //Increment the shared variable pthread_mutex_unlock(&the_mutex); //Release the lock } pthread_exit(0); } 这是自旋锁版本中的实现: void *incr(void *tid) { int i; for(i = 0; i < 10000; i++) { enter_region((int)tid); //Grab the lock sharedVar++; […]

连续硬盘上的空间 – NTFS

我的问题是关于NTFS Fs上的文件分配方法。 我有两个主要问题 – 当我在NTFS上创建文件时,它是否连续存储在物理硬盘上? 如果没有 – 是否有办法创建一个文件,当我写入它时,数据是连续存储的(在硬盘上)? 类似于数据库中的区域。 如果存在这样的文件 – 是否有任何方法可以从串/块中读取数据(使用C读取系统调用)。 我可以使用的最大束大小是多少。 我正在尝试为小型应用程序创建一个简单的基于文件的数据库,并希望在文件中创建我的数据库。 出于性能原因,我需要在磁盘上以连续的顺序保存我的数据并以串行方式读取它。 (我打算在我的应用程序中mmap这个文件)。