精华内容
下载资源
问答
  • 文章目录Linux Shell CentOS 查看Linux 操作系统 相关信息1、代码2、结果 Linux Shell CentOS 查看Linux 操作系统 相关信息 1、代码 prt "操作系统名称 \c" uname -s prt "计算机名称 \c" uname -n prt "操作系统...
    展开全文
  • 操作系统相关基本概念 内核态和用户态 为了区分不同程序的不同权利,人们发明了内核态和用户态的概念。如果一个程序运行在特权态,则该程序就可以访问计算机的任何资源,即它的资源访问权限不受限制。如果一个程序...

    操作系统相关基本概念

    内核态和用户态

    为了区分不同程序的不同权利,人们发明了内核态和用户态的概念。如果一个程序运行在特权态,则该程序就可以访问计算机的任何资源,即它的资源访问权限不受限制。如果一个程序运行在用户态,则其资源需求将受到各种限制。例如,如果要访问操作系统的内核数据结构,如进程表,则需要在特权态下才能办到。如果要访问用户程序里的数据,则在用户态下就可以了。

    CPU管理和内存管理都应该在内核态实现。诊断与测试程序也需要在内核态下实现,因为诊断和测试需要访问计算机的所有资源。对于文件系统来说,则可以一部分放在用户态,一部分放在内核态。文件系统本身的管理,即文件系统的宏数据部分的管理,必须放在内核态,不然任何人都可能破坏文件系统的结构。

     

    态势的识别

    那么计算机是如何知道现在正在运转的程序是内核态程序呢?这个标志就是处理器的一个状态位。这个状态位是CPU状态字里面的一个字位。这就是说,所谓的用户态、内核态实际上是处理器的一种状态,而不是程序的状态。我们通过设置该状态字,可以将CPU设置为内核态,或者用户态,或者其他的子态。一个程序运行时,CPU是什么态,这个程序就运行在什么态。

    内核态与用户态的实现

    在特权态下运行的程序可以访问任何资源,而用户态下的访问则受到限制。那么这种限制是如何实现的呢?

    要限制一个程序对资源的访问,需要对程序执行的每一条指令进行检查才能完成。而这种检查就是地址翻译。通过对地址翻译的控制,就可以限制程序对资源的访问。为了给内核态程序赋予访问所有资源的特权,系统处于内核态时,内核程序可以绕过内存地址翻译而直接执行特权指令

     

    若操作系统的所有功能都在内核态下运行,则会带来几个问题。首先,操作系统的所有服务都需要进入内核态才能使用,而从用户态转换为内核态是有时间成本的,这样就造成操作系统效率低下。随着操作系统功能和复杂性的增加,这种问题就十分明显了。

    因此,人们又想出一个办法,就是微内核结构,即只将操作系统核心中的核心放在内核态运行,其他功能都移到用户态。这样就同时提高了效率和安全性。

     

    展开全文
  • 本文通过一个Demo,讲解如何通过C#获取操作系统相关的信息,如内存大小,CPU大小,机器名,环境变量等操作系统软件、硬件相关信息,仅供学习分享使用,如有不足之处,还请指正。涉及知识点:Environment 提供有关...

    本文通过一个Demo,讲解如何通过C#获取操作系统相关的信息,如内存大小,CPU大小,机器名,环境变量等操作系统软件、硬件相关信息,仅供学习分享使用,如有不足之处,还请指正。

    涉及知识点:

    • Environment 提供有关当前环境和平台的信息以及操作它们的方法。
    • ManagementClass 表示公共信息模型 (CIM) 管理类。管理类是一个 WMI 类,如 Win32_LogicalDisk 和 Win32_Process,前者表示磁盘驱动器,后者表示进程(如 Notepad.exe)。通过该类的成员,可以使用特定的 WMI 类路径访问 WMI 数据。

    效果图

    系统信息 :获取如系统目录,平台标识,登录用户名,盘符,所在的域 等信息

    环境变量:即操作系统运行的参数,看看有没有眼前为之一亮的信息

    特殊目录:桌面,我的文档,收藏夹,等目录,是不是很熟悉

    操作系统:以下是获取CPU的信息,如型号,名称,个数,速度,厂商等信息【还可以获取其他如内存,硬盘等信息】

    代码如下:

    namespace DemoEnvironment
    {
        public partial class MainFrom : Form
        {
            public MainFrom()
            {
                InitializeComponent();
            }
    
            private void MainFrom_Load(object sender, EventArgs e)
            {
                string machineName = Environment.MachineName;
                string osVersionName = GetOsVersion(Environment.OSVersion.Version);
                string servicePack = Environment.OSVersion.ServicePack;
                osVersionName = osVersionName + " " + servicePack;
                string userName = Environment.UserName;
                string domainName = Environment.UserDomainName;
                string tickCount = (Environment.TickCount / 1000).ToString() + "s";
                string systemPageSize = (Environment.SystemPageSize / 1024).ToString() + "KB";
                string systemDir = Environment.SystemDirectory;
                string stackTrace = Environment.StackTrace;
                string processorCounter = Environment.ProcessorCount.ToString();
                string platform = Environment.OSVersion.Platform.ToString();
                string newLine = Environment.NewLine;
                bool is64Os = Environment.Is64BitOperatingSystem;
                bool is64Process = Environment.Is64BitProcess;
                
                string currDir = Environment.CurrentDirectory;
                string cmdLine = Environment.CommandLine;
                string[] drives = Environment.GetLogicalDrives();
                //long workingSet = (Environment.WorkingSet / 1024);
                this.lblMachineName.Text = machineName;
                this.lblOsVersion.Text = osVersionName;
                this.lblUserName.Text = userName;
                this.lblDomineName.Text = domainName;
                this.lblStartTime.Text = tickCount;
                this.lblPageSize.Text = systemPageSize;
                this.lblSystemDir.Text = systemDir;
                this.lblLogical.Text = string.Join(",", drives);
                this.lblProcesserCounter.Text = processorCounter;
                this.lblPlatform.Text = platform;
                this.lblNewLine.Text = newLine.ToString();
                this.lblSystemType.Text = is64Os ? "64bit" : "32bit";
                this.lblProcessType.Text = is64Process ? "64bit" : "32bit";
                this.lblCurDir.Text = currDir;
                this.lblCmdLine.Text = cmdLine;
                this.lblWorkSet.Text = GetPhisicalMemory().ToString()+"MB";
                //环境变量
                // HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment
                IDictionary dicMachine = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Machine);
                this.rtbVaribles.AppendText(string.Format("{0}: {1}", "机器环境变量", newLine));
                foreach (string str in dicMachine.Keys) {
                    string val = dicMachine[str].ToString();
                    this.rtbVaribles.AppendText(string.Format("{0}: {1}{2}", str, val, newLine));
                }
                this.rtbVaribles.AppendText(string.Format("{0}{1}", ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", newLine));
                // 环境变量存储在 Windows 操作系统注册表的 HKEY_CURRENT_USER\Environment 项中,或从其中检索。
                IDictionary dicUser = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.User);
                this.rtbVaribles.AppendText(string.Format("{0}: {1}", "用户环境变量", newLine));
                foreach (string str in dicUser.Keys)
                {
                    string val = dicUser[str].ToString();
                    this.rtbVaribles.AppendText(string.Format("{0}: {1}{2}", str, val, newLine));
                }
                this.rtbVaribles.AppendText(string.Format("{0}{1}", ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", newLine));
                IDictionary dicProcess = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Process);
                this.rtbVaribles.AppendText(string.Format("{0}: {1}", "进程环境变量", newLine));
                foreach (string str in dicProcess.Keys)
                {
                    string val = dicProcess[str].ToString();
                    this.rtbVaribles.AppendText(string.Format("{0}: {1}{2}", str, val, newLine));
                }
                //特殊目录 
                string[] names = Enum.GetNames(typeof(Environment.SpecialFolder));
                foreach (string name in names){
    
                    Environment.SpecialFolder sf;
                    if (Enum.TryParse<Environment.SpecialFolder>(name, out sf))
                    {
                        string folder = Environment.GetFolderPath(sf);
                        this.rtbFolders.AppendText(string.Format("{0}: {1}{2}", name, folder, newLine));
                    }
                }
                //获取其他硬件,软件信息
                GetPhicnalInfo();
            }
    
            private string GetOsVersion(Version ver) {
                string strClient = "";
                if (ver.Major == 5 && ver.Minor == 1)
                {
                    strClient = "Win XP";
                }
                else if (ver.Major == 6 && ver.Minor == 0)
                {
                    strClient = "Win Vista";
                }
                else if (ver.Major == 6 && ver.Minor == 1)
                {
                    strClient = "Win 7";
                }
                else if (ver.Major == 5 && ver.Minor == 0)
                {
                    strClient = "Win 2000";
                }
                else
                {
                    strClient = "未知";
                }
                return strClient;
            }
    
            /// <summary>
            /// 获取系统内存大小
            /// </summary>
            /// <returns>内存大小(单位M)</returns>
            private int GetPhisicalMemory()
            {
                ManagementObjectSearcher searcher = new ManagementObjectSearcher();   //用于查询一些如系统信息的管理对象 
                searcher.Query = new SelectQuery("Win32_PhysicalMemory ", "", new string[] { "Capacity" });//设置查询条件 
                ManagementObjectCollection collection = searcher.Get();   //获取内存容量 
                ManagementObjectCollection.ManagementObjectEnumerator em = collection.GetEnumerator();
    
                long capacity = 0;
                while (em.MoveNext())
                {
                    ManagementBaseObject baseObj = em.Current;
                    if (baseObj.Properties["Capacity"].Value != null)
                    {
                        try
                        {
                            capacity += long.Parse(baseObj.Properties["Capacity"].Value.ToString());
                        }
                        catch
                        {
                            return 0;
                        }
                    }
                }
                return (int)(capacity / 1024 / 1024);
            }
    
            /// <summary>
            /// https://msdn.microsoft.com/en-us/library/aa394084(VS.85).aspx
            /// </summary>
            /// <returns></returns>
            private int GetPhicnalInfo() {
                ManagementClass osClass = new ManagementClass("Win32_Processor");//后面几种可以试一下,会有意外的收获//Win32_PhysicalMemory/Win32_Keyboard/Win32_ComputerSystem/Win32_OperatingSystem
                foreach (ManagementObject obj in osClass.GetInstances())
                {
                    PropertyDataCollection pdc = obj.Properties;
                    foreach (PropertyData pd in pdc) {
                        this.rtbOs.AppendText(string.Format("{0}: {1}{2}", pd.Name, pd.Value, "\r\n")); 
                    }
                }
                return 0;
            }
        }
    }
    工程下载路径:https://download.csdn.net/download/xiatiancc/10300432
    展开全文
  • 精心整理的操作系统相关概念

    千次阅读 2016-11-15 16:04:31
    操作系统的发展 (一). 第一代(1945~1955):无操作系统 第一台计算机诞生时,还没出现操作系统,是每一步操作都是纯手工的。操作人员将对应于程序和数据的已穿孔的纸带装入机器,然后启动输入机把程序和数据输入...

    一. 操作系统的发展

    (一). 第一代(1945~1955):无操作系统

    第一台计算机诞生时,还没出现操作系统,每一步操作都是纯手工的。操作人员将对应于程序和数据的已穿孔的纸带装入机器,然后启动输入机把程序和数据输入到计算机内存,接着通过控制台开关启动程序针对数据运行,计算完毕后打印机输出结果,用户取出结果并卸下纸带,到下一个用户上机。

    (二). 第二代(1955~1965):单道批处理系统

    单道批处理系统中,内存中只允许存放一个作业,即当前正在运行的作业才能驻留内存,作业的执行顺序是先进先出,即按顺序执行。早期为了能充分地利用昂贵的计算机,应尽量使该系统连续运行,减少空闲时间。为此,通常是把一批作业以脱机方式输入到磁带上,并在系统中配上监督程序(Monitor),在它的控制下使这批作业能一个接一个地连续处理。其自动处理过程是:首先,由监督程序将磁带上的第一个作业装入内存,并把运行控制权交给该作业。当该作业处理完成时,又把控制权交还给监督程序,再由监督程序把磁带(盘)上的第二个作业调入内存。计算机系统就这样自动地一个作业一个作业地进行处理,直至磁带(盘)上的所有作业全部完成,这样便形成了早期的批处理系统。单道批处理系统无法充分利用系统中的所有资源,当作业进行I/O操作时,CPU只能处于等待状态,致使系统性能较差。

    (三). 第三代(1965~1980):多道批处理系统、分时系统、实时系统

    1. 多道批处理系统

    由于在单道批处理系统中,一个作业单独进入内存并独占系统资源,直到运行结束后下一个作业才能进入内存,当作业进行I/O操作时,CPU只能处于等待状态,因此,CPU利用率较低,尤其是对于I/O操作时间较长的作业。为了提高CPU的利用率,在单道批处理系统的基础上引入了多道程序设计(multiprogramming)技术,这就形成了多道批处理系统。即成批的作业存放在外存中,组成的一个后备队列,系统按一定的调度原则每次从后备作业队列中选取一个或多个作业进入内存运行,在内存中可同时存在若干道作业,作业执行的次序与进入内存的次序无严格的对应关系,这些作业是通过一定的作业调度算法来使用CPU的,一个作业在等待I/O处理时,CPU调度另外一个作业运行,从而在系统中形成一个自动转接的、连续的作业流,因此CPU的利用率显著地提高了。多道批处理系统的缺点是延长了作业的周转时间,用户不能进行直接干预,缺少交互性,不利于程序的开发与调试。

    2. 分时操作系统

    分时操作系统是一种联机的多用户交互式的操作系统。把计算机与许多终端用户连接起来,分时操作系统将系统处理机时间与内存空间按一定的时间间隔,轮流地切换给各终端用户的程序使用。对每个用户能保证足够快的响应时间,并提供交互会话能力,每个用户的感觉就像他独占计算机一样。分时操作系统的特点是对用户的请求及时响应,并在可能条件下尽量提高系统资源的利用率。分时操作系统典型的例子就是Unix和Linux的操作系统,其可以同时连接多个终端并且每隔一段时间重新扫描进程,重新分配进程的优先级,动态分配系统资源。

    3. 实时操作系统

    实时操作系统指能及时响应外部事件的请求,在规定的时间内完成对该事件的处理,并控制所有实时任务协调一致地运行计算机系统。实时操作系统有硬实时和软实时之分,硬实时要求在规定的时间内必须完成操作,这是在操作系统设计时保证的;软实时则只要按照任务的优先级,尽可能快地完成操作即可。我们通常使用的操作系统在经过一定改变之后就可以变成实时操作系统。

    例如,可以为确保生产线上的机器人能获取某个物体而设计一个操作系统。在“硬”实时操作系统中,如果不能在允许时间内完成使物体可达的计算,操作系统将因错误结束。在“软”实时操作系统中,生产线仍然能继续工作,但产品的输出会因产品不能在允许时间内到达而减慢,这使机器人有短暂的不生产现象。一些实时操作系统是为特定的应用设计的,另一些是通用的。一些通用目的的操作系统称自己为实时操作系统。但某种程度上,大部分通用目的的操作系统,如微软的Windows NT或IBM的OS/390有实时系统的特征。这就是说,即使一个操作系统不是严格的实时系统,它们也能解决一部分实时应用问题。

    实时系统还分为实时控制系统和实时信息处理系统。实时控制系统指的是要求实时控制的系统,主要用于生产过程的控制,实时采集现场数据,并对所采集的数据进行及时处理,进而自动地控制相应的执行机构,使某些(个)参数(如温度、压力、方位等)能按预定的规律变化,以保证产品的质量和提高产量。也可以用于武器的控制,如火炮的自动控制系统,飞机的自动驾驶系统,以及导弹的制导系统等。实时信息处理系统指能对信息进行及时的处理的系统,该系统由一台或多台主机通过能信线路连接成百上千个终端,计算机接收从远程终端发来的服务请求,根据用户提出的问题,对信息进行检索和处理,并在很短的时间内为用户做出正确的回答。典型的实时信息处理系统有:飞机订票系统、情报检索系统等。

    (四). 第四代(1980~1990):通用操作系统

    通用操作系统具有多种类型操作特征的操作系统。可以同时兼有多道批处理、分时、实时处理的功能,或其中两种以上的功能。例如:实时处理+批处理=实时批处理系统。首先保证优先处理实时任务,插空进行批处理作业。常把实时任务称为前台作业,批作业称为后台作业。再如:分时处理+批处理=分时批处理系统。即:时间要求不强的作业放入“后台”(批处理)处理,需频繁交互的作业在“前台”(分时)处理,处理机优先运行“前台”作业。

    (五). 后四代(1990年以后):网络操作系统、分布式系统、嵌入式系统

    1. 网络操作系统

    一种在通常操作系统功能的基础上提供网络通信和网络服务功能的操作系统。

    2. 分布式操作系统

    一种以计算机网络为基础的,将物理上分布的具有自治功能的数据处理系统或计算机系统互联起来的操作系统。分布式系统中各台计算机无主次之分,系统中若干台计算机可以并行运行同一个程序,分布式操作系统用于管理分布式系统资源。

    3. 嵌入式操作系统

    一种运行在嵌入式智能芯片环境中,对整个智能芯片以及它所操作、控制的各种部件装置等资源进行统一协调、处理、指挥和控制的系统软件。

    二. 相关概念

    (一). 作业

    1. 在批处理操作系统中,是以作业为基本单位从外存调入内存的,是计算机操作者(或是一个叫做作业调度器的程序)交给操作系统的执行单位。作业可以被看作是用户向计算机提交任务的任务实体。通常作业是以批处理的(而非交互式的)模式运行的。作业是由一系列有序的步骤组成的,作业的完成要经过作业提交、作业收容、作业执行和作业完成4个阶段,因此作业也可以视为操作系统的一条执行路径。

    2. 在IBM主机型操作系统(MVS,OS/390以及其后代产品)中,作业是用作业控制语言(JCL)来描述的,作业被分解为作业步。正在执行的一个或多个相关进程通常被称为作业,一个作业可以包含多个进程,比如当使用管道和重定向命令时,该作业就包含多个进程。

    3. Windows 2000提供了一个新的作业内核对象,它能将进程组合到一起并且建一个沙盒,以限制进程能够进行的操作所以作业可以视为进程的容器。

    4. 作业这个概念最早是在批处理系统中出现的,分时系统和实时系统中一般没有作业的概念。在多道批处理系统中,存在着作业调度和进程调度,但是在分时系统和实时系统中,一般不存在作业调度,而只有进程调度、交换调度、线程调度。因为在分时系统和实时系统中,为了缩短响应时间或者为了满足用户的截止时间,作业不是建立在外存,而是之间建立在内存中,这些系统中,一旦用户和系统交互开始,用户马上要进行控制,因而,这些系统中没有作业提交状态和后背状态,它们的输入信息经过终端缓冲区为了系统所接收,或者理解处理,或者经交换调度暂存外存中。

    (二). 批处理

    批处理指的是将作业按照它们的性质分组(或分批),然后再成组(或成批)地提交给计算机系统,由计算机自动完成后再输出结果,从而减少作业建立和结束过程中的时间浪费,一组(或一批)作业中有一个或多个作业。根据在内存中允许存放的作业数,批处理系统又分为单道批处理系统和多道批处理系统。在单道批处理系统中,用户将一批作业提交给系统后,系统会根据作业的先后顺序,一个接连一个连续处理,在同一时间内仅有一个作业在处理。在多道批处理系统中,用户将一批作业提交给系统后,系统会根据调度算法调度作业,当一个作业在等待I/O处理时,CPU调度另外一个作业运行,在同一时间内仅有一个作业在处理。不管在单道批处理系统或者在多道批处理系统中,只要系统正在运行,就不允许用户与其作业发生交互作用,发现作业错误也不能及时改正,直到系统崩溃或计算结束。批处理操作系统是为了提高CPU的利用率而提出的一种操作系统。

    (三). 多道程序(多任务)

    计算机的早期,多任务被称作多道程序。多道程序设计技术是在计算机内存中同时存放几道相互独立的程序,使它们在管理程序控制下,相互穿插运行,两个或两个以上程序在计算机系统中同处于开始到结束之间的状态, 这些程序共享计算机系统资源。与之相对应的是单道程序,即在计算机内存中只允许一个的程序运行。对于一个单CPU系统来说,程序同时处于运行状态只是一种宏观上的概念,他们虽然都已经开始运行,从微观上看是串行的,各道程序轮流使用CPU,交替执行,CPU上运行的程序只有一个。引入多道程序设计技术的根本目的是为了提高CPU的利用率,充分发挥计算机系统部件的并行性,现代计算机系统都采用了多道程序设计技术。多道程序设计的出现,加快了现在操作系统的诞生。

    (四). 程序

    程序是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列。计算机程序是由数据结构、算法和一种程序设计语言构成。软件就是经过包装的程序,有良好的用户界面。

    (五). 进程

    1. 广义的进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。进程的概念伴随着多道程序技术的出现而出现,在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。狭义的进程是正在运行的程序的实例。

    2. 进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。

    (六). 子进程

    1. Unix/Linux编程中,由fork创建的新进程被称为子进程(child process)。该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新进程(子进程)的进程 id。fork之后,操作系统会复制一个与父进程完全相同的子进程,虽说是父子关系,但是在操作系统看来,他们更像兄弟关系,这2个进程共享代码空间,但是数据空间是互相独立的,子进程数据空间中的内容是父进程的完整拷贝,指令指针也完全相同,子进程拥有父进程当前运行到的位置(两进程的程序计数器pc值相同,也就是说,子进程是从fork返回处开始执行的),但有一点不同,如果fork成功,子进程中fork的返回值是0,父进程中fork的返回值是子进程的进程号,如果fork不成功,父进程会返回错误。

    2. 在程序设计时,某一个具体的功能模块可以通过函数或是线程等不同的形式来实现。对于同一进程而言,这些函数、线程都是存在于同一个地址空间下的,而且在执行时,大多只对与其相关的一些数据进行处理。如果算法存在某种错误,将有可能破坏与其同处一个地址空间的其他一些重要内容,这将造成比较严重的后果。为保护地址空间中的内容可以考虑将那些需要对地址空间中的数据进行访问的操作部分放到另外一个子进程的地址空间中运行,并且只允许其访问原进程地址空间中的相关数据。

    (七).多进程

    在早期,为了使程序在多道程序下能并发执行,并对并发执行的程序加以控制和描述,在操作系统中引入了进程的概念,这样,多进程的概念也随之产生,就是多个进程并发执行。多进程最简单的理解是,在多道程序系统中,同时执行多个进程,进程间的关系不一定是父子进程关系,也可以是不相同的程序的进程。

    (八). 线程

    60年代,在操作系统中能拥有资源和独立运行的基本单位是进程,然而随着计算机技术的发展,进程出现了很多弊端,一是由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入轻型进程;二是由于对称多处理机(SMP)出现,可以满足多个运行单位,而多个进程并行开销过大。因此在80年代,即通用计算机系统发展的年代,出现了能独立运行的基本单位——线程(Threads)。线程是程序中一个单一的顺序控制流程。线程是进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位。

    (九). 多线程

    在有多线程的系统中,线程是能独立运行的基本单位,因而也是独立调度和分派的基本单位。由于线程很“轻”,故线程的切换非常迅速且开销小(在同一进程中的)。在一个进程中的多个线程之间,可以并发执行,甚至允许在一个进程中所有线程都能并发执行;同样,不同进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并行工作的能力。在同一进程中的各个线程,都可以共享该进程所拥有的资源,这首先表现在:所有线程都具有相同的地址空间(进程的地址空间),这意味着,线程可以访问该地址空间的每一个虚地址;此外,还可以访问进程所拥有的已打开文件、定时器、信号量机构等。由于同一个进程内的线程共享内存和文件,所以线程之间互相通信不必调用内核。

    (十). 计算机指令

    计算机指令就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令,执行程序的过程就是计算机的工作过程。通常一条指令包括两方面的内容:操作码和操作数,操作码决定要完成的操作,操作数指参加运算的数据及其所在的单元地址。在计算机中,操作要求和操作数地址都由二进制数码表示,分别称作操作码和地址码,整条指令以二进制编码的形式存放在存储器中。一台计算机所能执行的各种不同指令的全体,叫做计算机的指令系统,每一台计算机均有自己的特定的指令系统,其指令内容和格式有所不同。

    (十一). 作业、程序、进程、线程、指令之间的联系

    作业 > 程序 >= 进程 > 线程 > 指令

    一个作业中可以有多个程序,一个程序可以对应一个主进程和若干个子进程,一个进程可以有多个线程,线程里有多条指令,但是线程是不可分割的。总体上来说是一个从大到小的关系,作业是一系列的程序集,程序是进程的静态原形,进程按照一种特定的逻辑来实现一定的功能或者事务。进程就是作业的一种细化,每个进程完成一个特定的功能。线程就是进程更加一步的细化,进程可以分割,但是线程是原子的,不可以再度分割,就像化学中的质子一样,一系列的线程组成一个进程。进程的单位比较大,线程就是原始单位,不可分割成更小的部分,但线程也是由指令构成的。注意:一般在分时系统中没有作业的概念,单道批处理系统中没有进程的概念。

    三. 处理器

    (一). 处理器的多线程技术

    同时多线程Simultaneous Multithreading,简称SMT。SMT可通过复制处理器上的结构状态,让同一个处理器上的多个线程同步执行并共享处理器的执行资源,可最大限度地实现宽发射、乱序的超标量处理,提高处理器运算部件的利用率,缓和由于数据相关或Cache未命中带来的访问内存延时。当没有多个线程可用时,SMT处理器几乎和传统的宽发射超标量处理器一样。SMT最具吸引力的是只需小规模改变处理器核心的设计,几乎不用增加额外的成本就可以显著地提升效能。多线程技术则可以为高速的运算核心准备更多的待处理数据,减少运算核心的闲置时间。

    (二). 多核心处理器

    多核心,也指单芯片多处理器(Chip Multiprocessors,简称CMP)。CMP是由美国斯坦福大学提出的,其思想是将大规模并行处理器中的SMP(对称多处理器)集成到同一芯片内,各个处理器并行执行不同的进程。这种依靠多个CPU同时并行地运行程序是实现超高速计算的一个重要方向,称为并行处理。多线程技术的出现一般会让每个核心处理一条线程。

    (三). 多处理器

    SMP(Symmetric Multi-Processing),对称多处理结构的简称,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。在这种技术的支持下,一个服务器系统可以同时运行多个处理器,并共享内存和其他的主机资源。
    构建一套SMP系统的必要条件是:支持SMP的硬件包括主板和CPU;支持SMP的系统平台,再就是支持SMP的应用软件。为了能够使得SMP系统发挥高效的性能,操作系统必须支持SMP系统,如WINNT、LINUX、以及UNIX等等32位操作系统。即能够进行多任务和多线程处理。多任务是指操作系统能够在同一时间让不同的CPU完成不同的任务;多线程是指操作系统能够使得不同的CPU并行的完成同一个任务。

    展开全文
  • 操作系统相关面试题(1)

    千次阅读 2017-06-30 11:28:52
    一、操作系统引论 操作系统目标 1:方面性,2:有效性,3:可扩展性,4:开放性   操作系统基本特性 1:并发、2:共享、3:虚拟、4:异步  描述多道批处理、分时、实时操作系统的特点各是什么?  批处理操
  • ROS(1和2)机器人操作系统相关书籍、资料和学习路径

    万次阅读 多人点赞 2017-10-09 08:41:21
    ROS发展10年了,已经逐渐成为通用的机器人操作系统标准。ROS 2相关资料链接:http://blog.csdn.net/zhangrelay/article/details/78778590。 之前写过一篇博文总结过相关书籍(流行版本和相关书籍汇总),但是并没有...
  • java获取操作系统相关信息

    千次阅读 2011-12-29 19:17:35
    我需要的是System.getProperty("sun.desktop")获取系统类型,因为我用的是Windows操作系统,所以返回的String为windows.用System.getProperty("os.name")可以获取更详细的一些信息,我得到的结果为windows xp
  • 在Java中,显示操作系统相关信息

    千次阅读 2014-07-01 19:05:36
    使用Java语言调用操作系统基本信息,操作系统名称、操作系统版本、用户账户名称、用户主目录、用户当前工作目录等...
  • VC获取操作系统相关信息

    千次阅读 2013-10-10 11:17:56
    1、获取系统版本   int a=0,b=0,i=0,j=0; _asm { pushad mov ebx,fs:[0x18] ; get self pointer from TEB mov eax,fs:[0x30] ; get pointer to PEB / database mov ebx,[eax+0A8h] ; get ...
  • 一、修改Linux登录密码 1、重启 2、5秒倒计时后按E键 3、再次按E键 4、选中第二项按E键 5、输入空格+s然后回车 6、选中第二项按B键进入单一模式 7、可输入“whoami”查看当前...10、输入“re...
  • 欢迎支持或参与智能终端操作系统Hello China的开发,下面是相关联系方式和求助渠道: blog:blog.csdn.net/hellochina15(即本blog) 作者QQ:89007638 作者E-mail:garryxin@yahoo.com.cn QQ技术讨论群:...
  • 操作系统开发相关的一些问题的思考

    千次阅读 热门讨论 2011-09-26 22:20:09
    在从事操作系统开发过程中,对操作系统相关的一些问题尤其敏感。下面这些内容,都是就一些典型的问题或观点,与朋友或同事有过讨论之后,形成的一些个人结论或想法。只是一家直言,不免有片面之处,欢迎朋友们批评...
  • 操作系统书籍推荐

    千次阅读 2019-10-29 18:03:12
    最近又在学习内核,好久没有写写博客了,习惯性的再罗列一下操作系统相关的经典书籍吧: 可选: 编码的奥秘 计算机系统要素 必选: 深入理解计算机系统 操作系统精髓与设计原理 深入理解linux内核 深入理解...
  • testMyFileSystem 接收用户输入的文件操作命令,测试文件系统和API 只要提交一个makefile文件完成代码自动生成的工作,过程是研究UNIX V6++的各种代码然后剪剪切切改改用到自己的程序里面。 要实现把文件存进取出,...
  • 尽管操作系统发展史不是研究操作系统的重点,但是在这一发展过程中,衍生出了许许多多与操作系统相关的重要概念,如果知道这些概念出现在怎样的背景下,以及产生的原因,在后期学习中就不会觉得一些概念出现的比较...
  • 1、系统上对PCIE卡上下电 查看PCIE卡所在目录,对其进行上下电操作,槽位号可以查看硬件的编号 cd /sys/bus/pci/slots/13,然后运行echo 0 > power下电,运行echo 1 > power上电 2、切换网卡的工作模式 ethtool -s ...
  • 操作系统相关计算题

    千次阅读 2016-09-12 22:53:14
    1. 数据传输率(C)=记录位密度(D) x 线速度( V ) 例题1:一磁带机有9道磁道,带长700m,带速2m/s,每个数据块1k字节,块间间隔14mm。如果数据传输率为128000字节/秒,求记录位密度为()字节/m. ...
  • QSysInfo获取操作系统相关信息

    千次阅读 2017-04-13 16:23:59
    QSysInfo类可以为我们提供一些有关当前系统的底层信息
  • 操作系统之内核态和用户态及相关概念操作系统之内核态和用户态一、操作系统结构:二、微内核操作系统三、内核态和用户态用户态和内核态的转换四、常见的内核态常见总结:相关概念:操作系统的运行机制中断和异常的...
  • 操作系统 1. 中断和陷入有什么异同? 外中断时指来自处理机和内存外部的中断,如I/O中断、定时器中断、外部信号中断等。狭义上也叫中断; 内中断主要指在处理机和内存内部产生的中断,也称陷入,如校验错、页面失效...
  • 王道操作系统中页表相关计算

    千次阅读 多人点赞 2018-11-04 20:19:24
    页表:各个页离散地存储在内存的任一物理块中,为了能在内存中找到每个页面所对应的物理块,系统为每个进程建立了一张页面映像表,简称页表(一般存放在内存中); 页表项:页表是由页表项组成的,每一行就是一个...
  • LwIP 之三 操作系统隔离接口 sys_arch

    千次阅读 2018-05-04 18:46:21
      LwIP为了适应不同的操作系统,在代码中没有使用和某一个操作系统相关的系统调用和数据结构。而是在LwIP和操作系统之间增加了一个操作系统封装层。操作系统封装层为操作系统服务(定时,进程同步,消息传递)提供了一...
  • 显示linux操作系统相关信息

    千次阅读 2013-02-17 11:30:10
    1.显示当前操作系统名称(uname)  -s, --kernel-name 输出内核名称  -n, --nodename 输出网络节点上的主机名  -r, --kernel-release 输出内核发行号  -v, --kernel-version 输出内核版本  -m, --...
  • 操作系统常见面试和笔试题

    万次阅读 2017-09-06 13:22:36
    操作系统是编程最重要的基础之一,操作系统相关知识广泛应用在程序设计、系统调优、问题追查、性能优化等重要场景中,一个不懂操作系统的程序员不可能写出优秀的代码,更不可能设计出优秀的系统架构,所以操作系统...
  • 操作系统课程简介与引导扇区

    千次阅读 2020-04-12 00:12:49
    课程目标:能够设计,修改操作系统相关模块,掌控操作系统,保证完成八个大作业。(因为要自己动手实践,所以,比较难。老师原话:很难。) 看了斯坦福的操作系统目标,都不好意思说自己学过操作系统了。世界...
  • Linux操作系统基础(完结)

    万次阅读 多人点赞 2016-03-09 21:00:45
    一、Linux操作系统概述 二、Linux操作系统安装 三、Linux文件系统及文件基础 四、Linux操作系统命令使用基础 五、Linux应用程序的安装与卸载基础 五、用户及进程 六、相关信息查询 七、网络配置 八、Linux...
  • linux系统安装后相关操作

    千次阅读 2018-02-23 11:25:22
    修改开机启动项vi /etc/inittab2修改开机倒计时vi /boot/grub/grub.conf 修改IPvi /etc/sysconfig/network-scripts/ifcfg-eth0 修改主机名vi /etc/sysconfig/network修改ip映射关系vi /etc/hosts更改虚拟机网段查看...
  • python获取操作系统信息

    千次阅读 2018-08-27 23:14:46
    获取操作系统相关信息 #coding=utf-8 import platform def TestPlatform( ): print ("----------Operation System--------------------------") # 获取Python版本 print platform.python_version...
  • 自己动手写操作系统

    千次阅读 2013-01-27 19:39:34
     磨刀不误砍柴工 ... ...《自己动手写操作系统》其实阅读所需要的前提不过只是C和汇编了,里面涉及到很多操作系统的东西。于渊前辈大部分都已经阐释明白。特别是在很多与操作系统相关繁杂理论上面
  • 基于项目的操作系统学习

    千次阅读 2015-01-29 10:44:54
    自己所学的专业也不是正统的计算机科学,而是数学与计算科学,主要方向是算法和计算数学着这一块,而且目前尚处于大二上阶段,操作系统没学,所以遇到好多操作系统相关的概念都非常的困扰。现在趁着在做高性能计算...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,114
精华内容 29,245
关键字:

操作系统相关