【Windows】操作系统之任务管理器(第一篇)

一、操作系统简介

Windows操作系统是由微软公司(Microsoft)开发的一款图形操作系统,它以其强大的功能和广泛的用户基础,成为了目前世界上用户使用最多、兼容性最强的操作系统之一。以下是关于Windows操作系统的详细介绍:

一、历史与发展

  • 起源:Windows操作系统的历史可以追溯到1983年,当时微软推出了第一个版本Windows 1.0。随着时间的推移,Windows系统经历了多个版本的迭代和发展,逐渐成为了计算机领域的主导操作系统。
  • 重要版本:Windows系统的主要版本包括Windows XP、Windows 7、Windows 8、Windows 10以及最新的Windows 11等。每个版本都引入了新的功能和改进,以满足不同用户的需求。

二、主要功能

Windows操作系统具有多种核心功能,这些功能共同构成了其强大的计算机使用体验:

  1. 处理机管理:负责处理中断事件、处理器调度等,确保计算机能够高效地运行多个任务。
  2. 存储管理:管理存储器资源,为多道程序运行提供支撑,包括存储分配、存储共享、存储保护和存储扩充等功能。
  3. 设备管理:管理各类外围设备,完成用户提出的I/O请求,提高I/O设备的利用率。
  4. 文件管理:对系统的信息资源进行管理,实现文件的共享、保护和保密,保证文件的安全性。
  5. 网络与通信管理:支持多协议标准,如TCP/IP,提供Internet连接和网络管理功能。
  6. 用户接口:提供友好的用户接口,包括程序接口、命令接口和图形接口,方便用户与系统进行交互。

三、特点与优势

  1. 易用性:Windows操作系统具有直观的图形用户界面(GUI),易于理解和使用。
  2. 多任务处理能力:支持同时运行多个应用程序,提高工作效率。
  3. 安全性:具有强大的安全特性,如账户控制、权限控制、文件安全等,保护用户数据和设备安全。
  4. 稳定性:经过不断优化和改进,Windows操作系统具有很好的稳定性,能够减少崩溃和故障的发生。
  5. 网络支持:支持多协议标准,方便用户进行Internet连接和网络管理。
  6. 自动更新:提供定期更新服务,不断改进功能和修复故障,提升用户体验。

操作系统是硬件上面第一层软件,直接与硬件交流,在操作系统中安装了很多的软件,也就是所谓的程序,程序是静态的指令。它只占系统磁盘的空间。执行以后,变成进程,占系统内存。

二、程序如何变成进程?

程序的编译过程通常包括四个主要阶段:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。下面将详细解释每个阶段的作用和主要任务。

1. 预处理(Preprocessing)

作用
预处理是编译过程的第一步,它主要处理源代码中的预处理指令(如#include、#define等),并准备源代码以便后续的编译阶段。

主要任务

  • 宏定义展开:将所有的#define删除,并展开所有的宏定义。
  • 处理预编译指令:如#if、#elif、#else、#endif等条件编译指令。
  • 头文件包含:处理#include预编译指令,将被包含的文件插入到预编译指令的位置。
  • 删除注释:删除所有的注释。
  • 添加行号信息:添加行号信息、文件名标识,便于调试。
  • 保留#pragma指令:因为在编写程序时,经常要用到#pragma指令来设定编译的状态或指示编译器完成一些特定的动作。

示例
使用GCC编译器时,可以通过gcc -E main.c -o main.i命令生成预处理后的文件(.i文件)。

2. 编译(Compilation)

作用
编译是将预处理后的源代码转换成汇编代码的过程。

主要任务

  • 词法分析:将源代码字符串分割成一系列的标记(tokens)。
  • 语法分析:根据语言的语法规则,将标记组织成语法树(或抽象语法树)。
  • 语义分析:检查语法树的语义正确性,并进行类型检查等。
  • 中间代码生成:从语法树生成中间代码,便于后续的优化和生成目标代码。
  • 目标代码生成:将中间代码转换成特定平台的汇编代码。

示例
使用GCC编译器时,可以通过gcc -S main.i -o main.s命令生成汇编代码文件(.s文件)。

3. 汇编(Assembly)

作用
汇编是将汇编代码转换成机器码(二进制指令)的过程。

主要任务

  • 指令翻译:根据汇编指令和特定平台的规则,将汇编指令翻译成二进制形式的机器码。
  • 符号表生成:生成符号表,其中包含了程序中使用的变量、函数等的地址信息。
  • 生成目标文件:将翻译后的机器码和符号表等信息打包成目标文件(.o文件或.obj文件)。

示例
使用GCC编译器时,可以通过gcc -c main.s -o main.o命令生成目标文件(.o文件)。

4. 链接(Linking)

作用
链接是将多个目标文件以及所需的库文件合并成一个可执行文件的过程。

主要任务

  • 符号解析:解析目标文件中的符号引用,确定每个符号的实际地址。
  • 重定位:根据符号的实际地址,修改目标文件中相关的引用地址。
  • 库文件合并:将程序中用到的库文件中的代码和数据合并到可执行文件中。
  • 生成可执行文件:最终生成一个可以在特定平台上运行的可执行文件。

示例
使用GCC编译器时,可以通过gcc main.o -o main命令将目标文件链接成可执行文件(main)。

综上所述,程序的编译过程是一个复杂且系统的过程,它涉及多个阶段和多个方面的知识和技术。通过这个过程,高级语言编写的源代码被转换成计算机可以直接执行的机器码。

三、应用 任务管理器

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <windows.h>
#include <tlhelp32.h>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
public:
    void showProcess();

private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //显示所有的进程
    showProcess();


}

Widget::~Widget()
{
    delete ui;
}

void Widget::showProcess()
{
     //显示所有的进程
    PROCESSENTRY32  pe =  {sizeof(PROCESSENTRY32)};
    //1.获取操作系统的进程的链表,快照
    HANDLE hsnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if( INVALID_HANDLE_VALUE == hsnapShot)return;
    //2.获取链表的头
    bool bflag = Process32First(hsnapShot,&pe);

    //Qt 垃圾自动回收机制---- 对象树
    QString str;
    int i =0;
    while(bflag){
        //进程名称
        str = QString::fromWCharArray(pe.szExeFile);
        ui->tableWidget->setItem(i,0,new QTableWidgetItem(str));
        //进程id
        str = QString::number(pe.th32ProcessID);
        ui->tableWidget->setItem(i,1,new QTableWidgetItem(str));
        //线程数
        str = QString::number(pe.cntThreads);
        ui->tableWidget->setItem(i,2,new QTableWidgetItem(str));
        //3.遍历链表
       bflag = Process32Next(hsnapShot,&pe);
        ++i;
    }

}


void Widget::on_pushButton_clicked()
{
    //获取进程id
   int nRow = ui->tableWidget->currentRow();
   if(nRow == -1)return;
   QTableWidgetItem *pitem =  ui->tableWidget->item(nRow,1);
    //获取句柄
   int nProcessId = pitem->text().toInt();
   HANDLE hProcess= OpenProcess(PROCESS_TERMINATE,0,nProcessId);
    //结束进程
   if(hProcess){
        TerminateProcess(hProcess,-1);
        ui->tableWidget->removeRow(nRow);
   }
}

  • 22
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的小猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值