从今天开始系统学习操作系统的知识,简单记录一下几个要点。
1.父进程与子进程的资源关系子进程得到的是除了代码段是与父进程共享的以外,其他所有的都是得到父进程的一个副本,子进程的所有资源都继承父进程,得到父进程资源的副本,既然为副本,也就是说,二者并不共享地址空间。,两个是单独的进程,继承了以后二者就没有什么关联了,子进程单独运行。(采用写时复制技术)
从理论上父进程创建子进程以后,子进程就拥有了自己的进程表和堆栈空间,数据段空间,仅仅代码段与父进程相同。感觉好像堆栈空间,数据段空间与父进程一旦脱离,此时,子进程就脱离了父进程。所以父进程终止,不影响子进程运行。但是实际上可能有三种情况,父进程要子进程结果,父进程没等到被kill了,子进程也没什么意义了,也kill得了。对于第二种,子进程被创造后与父进程无关了,那就留下,当个单独的进程或者找个养父。对于第三种,创建了两个参数完全一样的子进程,那就杀死一个留下一个,留下来的当单独进程或者找个养父。(是所有操作系统都这样还是看设计者而定,有待后续深入学习)。
2.Java创建的是哪种线程取决于os,java只是调用os提供的创建线程接口,到底这个线程是怎么实现的,跟java无关。比如windows上,jvm调用_beginthreadex创建线程,这是内核线程。另外,《深入理解jvm》里面有说,开三个java实例,就是三个java虚拟机。
3.进程拥有资源,资源是指什么这样的资源通常是指由操作系统维护、跟踪、分配和释放的东西
最简单几个例子:
CPU资源,每个进程有自己的优先级,其中的每个线程有基于这个进程优先级的线程优先级。操作系统的调度程序根据每个线程的优先级来为线程分配处理器时间。
内存资源,每个进程有自己的地址空间,它被操作系统分页机制映射到物理内存或文件(虚拟内存)。通过一般途径获取的内存都能在进程结束时被系统自动释放。
文件资源,每个进程都可以打开多个文件,当进程结束时,操作系统通常会自动关闭这些文件句柄。一个操作系统同时能够打开的文件是优先的。
还有其他各种资源,如各种操作系统对象(窗口,事件,线程,COM组件等),操作系统提供资源通常是以句柄的方式实现的。
这些资源的共同特点是:他们都是由操作系统维护和跟踪的;多数情况下,各种资源的总量是有限的;资源通常会有“分配/释放”语义。
需要注意的一点是:通常如果某个资源是属于某个进程时,这个资源会在进程关闭时被释放,而如果资源是不依赖于具体进程的,或者被多个进程共享时,则操作系统不会释放它。这是资源泄露问题。
对于每一个进程都会对应一个虚拟地址空间,对于32位的操作系统(其指令的位数最大为32位,因此地址码最多32位),虚拟地址空间的大小为2^{32}B即0~4GB的虚拟地址空间,其中内核空间为1GB。
在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中,这个沙盘就是虚拟地址空间(virtual address space)。虚拟地址空间由内核空间(kernel space)和用户模式空间(user mode space)两部分组成。
虚拟地址会通过页表(page table)映射到物理内存,页表由操作系统维护并被处理器引用,每个进程都有自己的页表。内核空间在页表中拥有较高特权级,因此用户态程序试图访问这些页是会导致一个页错误(page fault)。其中内核空间是持续存在的,并且在所有进程中都映射到同样的物理内存。与此相反,用户模式空间的映射随进程切换的发生而不断变化。



