操作系统复习:页面变换表PMT与存储管理

需积分: 10 5 下载量 127 浏览量 更新于2024-08-25 收藏 2.17MB PPT 举报
"页面变换表PMT是操作系统中用于管理内存的一种数据结构,它与作业表JT和存储分块表MBT一起工作,实现分页存储管理。操作系统在内存管理方面扮演着关键角色,包括处理机管理、存储管理、设备管理、信息管理以及提供用户接口。此外,操作系统还具有并发性、共享性、虚拟性和不确定性的特征,并通过多道程序设计实现宏观上的并行。根据功能和应用场景,操作系统可划分为批处理、分时、实时、嵌入式、个人计算机、网络和分布式操作系统等类型。操作系统运行依赖于硬件环境,如CPU、存储系统、中断机制等,并需要区分特权指令和非特权指令,以及管理CPU在管态和目态之间的转换。" 在分页存储管理中,页面变换表PMT(Page Mapping Table)用于映射进程的逻辑页号到实际的内存块号。每个进程都有一个独立的页表,其中记录了逻辑页号与物理块号的对应关系。此外,系统还维护了作业表JT,它保存了进程页表的起始位置、长度和状态等信息,以及存储分块表MBT,用于跟踪主存中各块的分配情况。这些数据结构共同协作,确保进程能够正确地访问其在内存中的数据。 操作系统作为计算机系统的核心,负责管理和控制硬件资源,比如CPU、内存和外设,同时协调多个并发执行的任务,提供一个高效且用户友好的环境。操作系统通过权限机制来区分特权指令和非特权指令,以保护系统的关键操作不被非法用户程序篡改。在CPU状态管理中,存在两种状态——管态(特权态)和目态(用户态),前者允许执行特权指令,而后者则限制了对这些指令的访问。在从目态到管态的转换中,通常只能通过中断机制进行;而从管态返回目态,则通常需要修改程序状态字。 操作系统提供了多种服务,如处理机调度,内存分配策略(如最佳适配、最差适配、首次适配等),设备分配,以及文件系统管理。在内存管理中,界地址寄存器(也称界限寄存器)和存储键等硬件机制有助于实现存储保护,防止进程越界访问内存,确保系统稳定性和安全性。 在多道程序设计中,多个进程可以并发执行,尽管在微观层面上仍然是串行的。这种设计提高了系统资源的利用率,但同时也引入了不确定性,因为操作系统必须根据各种因素(如进程优先级、等待时间等)做出调度决策。操作系统的发展和演变已经涵盖了各种类型的系统,从传统的批处理和分时系统到现代的网络和分布式操作系统,满足不同场景的需求。

#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <sys/shm.h> #include <pthread.h> #define SHM_PATH "/mnt/hgfs" struct mt { int num; pthread_mutex_t mutex; pthread_mutexattr_t mutexattr; }; int main () { int iRet=0; unsigned nMemSize=sizeof(struct mt); struct mt *pMt; int iShm_id=0; key_t key =ftok(SHM_PATH, 0); iShm_id=shmget(key,nMemSize,0660|IPC_CREAT); printf("key :iShmID = %d:%d ",key, iShm_id); if(iShm_id<0) { iRet=-1; perror("shmget failed "); return iRet; } pMt = (struct mt*)shmat(iShm_id, NULL, 0); if (-1 == (long)pMt) { perror("shmat addr error "); return -1; } pMt->num=0; pthread_mutexattr_init(&pMt->mutexattr); //???mutex???? pthread_mutexattr_setpshared(&pMt->mutexattr, PTHREAD_PROCESS_SHARED); //?????????? pthread_mutex_init(&pMt->mutex, &pMt->mutexattr); //?????mutex? pid_t child_pid; printf ("the main program process ID is %d ", (int) getpid ()); child_pid = fork (); if (child_pid != 0) { int i=0; int iTmp=0; for (i = 0; i < 1000; i++) { pthread_mutex_lock(&pMt->mutex); iTmp=(pMt->num); printf("-parent----num++ %d ", pMt->num); pMt->num=iTmp+1; pthread_mutex_unlock(&pMt->mutex); usleep(1000); } if (0!= shmdt((void*)pMt)) { perror("shmdt addr error "); return -1; } } else { int i=0; int iTmp=0; for (i = 0; i < 1000; i++) { pthread_mutex_lock(&pMt->mutex); iTmp=(pMt->num); printf("*******************child----num++ %d ", pMt->num); pMt->num=iTmp+1; pthread_mutex_unlock(&pMt->mutex); usleep(1000); } if (0!= shmdt((void*)pMt)) { perror("shmdt addr error "); return -1; } } return 0; }

2023-06-08 上传