操作系统高响应比优先模拟算法,创设文件touc

2019-10-04 作者:美高梅4688am   |   浏览(134)

    Sportage瑞鹰 =  (估摸运行时刻 + 等待时间) / 猜度运维时刻 = 1 + 等候时间/推测运转时刻;

 

Name

它代表DLL 名称的周旋虚地址(译注:相对八个用null作为实现符的ASCII字符串的一个奇骏VA,该字符串是该导入DLL文件的称号。如:KECR-VNEL32.DLL)。

二. 复制文件

  2.1 使用cp命令来复制文件,供给多个参数-----源对象和对象对象。举个例子在opt目录下将test2.txt复制一份为test3.txt。
        图片 1

  2.2 使用cp –景逸SUV参数,能够一条命令将全部目录内容递归复制,举个例子将/opt目录及目录下具备文件复制到/usr下, 查看 /usr/opt 内容已总体复制过来。
        图片 2

      下边是删除/usr/opt目录及目录下有所文件

         图片 3

   2.3 也能够在cp命令中选取通配符,例如将opt目录下的以.txt结尾的公文全部复制到/usr目录下。
        图片 4

图片 5图片 6

  这学期刚最早上学操作系统,收到三个作业,百度关于高响应比优先(HEscort路虎极光N,Highest Response Ratio Next)的CPU进度调治模拟算法,基本观念:短作业优先调节算法 + 动态优先权机制;既思考作业的实行时间也虚构作业的等候时间,综合了先来先服务(FCFS,First Come First Served)和最短作业优先(SJF,Shortest Job First)三种算法的特色。

开垦Visio后新建贰个拓扑图,发掘左侧形状一栏不见了

在 PE文件头的 IMAGE_OPTIONAL_HEADE翼虎 结构中的 DataDirectory(数据目录表) 的第贰个分子就是指向输入表的。每种被链接进来的 DLL文件都分别对应一个IMAGE_IMPORT_DESC中华VIPTOWrangler (简称IID) 数组结构。

一.开立文件

  使用touch 能够创设空文件,举例opt目录下创制test2.txt文本。这种日常是不怎么程序要求求先创制文件,工夫运用。
        图片 7

创制Logo标志 Handlers (续)

    周转时间 =(作业完结的时光 - 作业提交时间);

 形状栏能够保存非常多自定义图形,怎么技术将造型一栏重新展现出来呢?方法其实很轻易,方法如下所示:

在那一个IID数组中,并从未建议有多少个项(就是从未鲜明指明有稍许个链接文件),但它提起底是以八个全为NULL(0) 的 IID 作为达成的标识。

 四.链接文件 ln(分享文件)   

    链接文件是linux文件系统的二个优势,如必要在系统上爱戴同一个文件的两份或多份别本,除了保留多份单独的物理文件别本之外,仍是能够利用保存一份物理文件别本和七个设想别本的方式。设想别本叫链接。链接是目录中针对文件真实地点的点位符。分二种档案的次序文件链接类型: 一是符号链接又叫软链接, 二是硬链接。
    4.1 符号链接正是三个确切的文件,它指向存放在虚拟目录结构中有些位置的另三个文书,那四个通过标识链接在一块的文本,相互的内容并不一致样。

      使用ln命令以及-s选项来创建符号链接,上面是在etc目录下,给my.cnf创制符号链接在本目录。
      图片 8

      如下所示:ls_my.cnf独有6字节,它只是指向my.cnf而已。
      图片 9

      尝试随便动用vim修改有个别配置个公文,都会在另一文件中期维修改,因为是符号链接。
      图片 10

      链接文件为 Linux 系统消除了文本的分享利用,还带来了隐形文件路线、扩大权限安全及节省存款和储蓄等好处。

    4.2 硬链接会成立独立的杜撰文件,个中蕴藏了村生泊长文件的音信及岗位,援用硬链接文件一律援引了源文件。ln命令不必要加额外参数。

      使用ln命令来创立硬链接,依旧使用etc下的my.cnf来演示:
      图片 11

      上图使用了ls –li 命令突显了inode编号,列表第一列(文件的独步一时标记,它用来不一致同一个文书而非是文件名来分别)以及长列表。带有硬链接的文书分享inode编号。因为它们究竟是同一个文件,链接计数字显示示2(列表中第三项),突显七个公文皆有五个链接,其余它们文件大小也一律。

      图片 12

      尝试随便某些配置文件,都会在另一文本中期维修改,因为是三个完全同样的别本. 是一个 inode 号对应多个文本名, 硬链接便是同二个文书使用了多少个小名

总结:

  硬链接以下几点天性:

    文件有同样的 inode;

    只好对已存在的文书实行创办;

    无法时有时无文件系统实行硬链接的创导;

    无法对目录进行创办,只可对文件成立;

    删除三个硬链接文件并不影响其余有平等 inode 号的公文;

  软链接以下几点特性:

    软链接有本人的文件属性及权限等;

    可对荒诞不经的文本或目录成立软链接;

    软链接可陆陆续续文件系统;

    软链接可对文本或目录创造;

    创制软链接时,链接计数 i_nlink 不会大增;

    删除软链接并不影响被针对的文件,但若被针对的原来的小说件被剔除,则相关软连接被叫作死链接(即 dangling link,若被针对路线文件被另行创建,死链接可还原为常规的软链接)

 

图片 13

 1 #include "bits/stdc++.h"
 2 #include "windows.h"
 3 using namespace std;
 4 typedef long long ll; 
 5 
 6 //(所有时间以分钟为单位存储,需要时转化) 
 7 
 8 ll systemTime;    //自定义系统当前时间
 9 
10 struct Task{
11     int Tij; //提交时间 
12     int Ysi; //预计运行时间 
13     ll waitingTime;  //等待时间
14     int id; //作业号
15     
16     ll prior(){
17         return 1 + waitingTime*1.0/Ysi;
18     }
19     
20     Task(int T, int Y){
21         Tij = T;
22         Ysi = Y;
23         waitingTime = 0;
24     }
25     ll aroundTime(){
26         return systemTime - Tij + Ysi;
27     }
28     
29     double priorTime(){
30         return aroundTime()*1.0/Ysi;
31     }
32     void disp(int ord){
33         printf("--调度次序: %d --作业号: %04d --调度时间:%02d%02d --周转时间: %d min(s) --带权周转时间%.2f  ...n", 
34             ord, id, (systemTime/100 + systemTime/60)%24, systemTime%60, aroundTime(), priorTime());
35     }
36 };
37 
38 int cmp1(const Task* a, const Task* b){
39     return (a->Tij) < (b->Tij);
40 }
41 
42 int main(){
43     vector<Task*> taskArr;    ///以不定长数组存储作业队列
44     
45     int Tij, Ysi, order;
46     ll ave_aroundTime = 0;
47     double ave_prior_aroundTime = 0;
48     
49     freopen("test.txt", "r", stdin);
50     system(".\生成测试数据.exe 1024");    //调用测试数据生成程序
51     
52     while(cin>>Tij>>Ysi) taskArr.push_back(new Task(Tij%100 + Tij/100*60, Ysi));
53     
54     ////按提交时间进行排序并编号 
55     sort(taskArr.begin(), taskArr.end(), cmp1);
56     std::vector<Task*>::iterator pos;
57     for(pos = taskArr.begin(); pos != taskArr.end(); pos++){
58         (*pos)->id = pos - taskArr.begin();
59     }
60     
61     std::vector<Task*>::iterator willRun;  //指向即将运行程序 
62     systemTime = (*taskArr.begin())->Tij;    ///将系统当前时间设置为最早提交的作业时间 
63     order = -1;
64     while(!taskArr.empty()){
65         bool flag = false; ///判定是否有新的程序提交 
66         willRun = taskArr.begin();
67         for(pos = taskArr.begin(); pos != taskArr.end(); pos++){
68             if((*pos)->Tij > systemTime) break;
69             willRun = (*willRun)->prior() < (*pos)->prior() ? pos : willRun;
70             flag = true;
71         }
72         if(!flag){
73             willRun = taskArr.begin();
74             systemTime = (*willRun)->Tij;
75         }
76         
77         (*willRun)->disp(++order);
78         
79         ave_aroundTime += (*willRun)->aroundTime();  //总周转 
80         ave_prior_aroundTime += (*willRun)->priorTime();  //总带权周转 
81         
82         for(pos = taskArr.begin(); pos != taskArr.end(); pos++){  //更新等待时间 
83             if((*pos)->Tij < systemTime){
84                 (*pos)->waitingTime += (*willRun)->Ysi;
85             }
86         }
87 
88         systemTime += (*willRun)->Ysi;  //系统时间增加 
89 
90         taskArr.erase(willRun); //结束则删除 
91         
92         //Sleep(10);
93     }
94     cout<<ave_aroundTime<<' '<<ave_prior_aroundTime<<endl;
95     printf("n----平均周转时间: %.2f --平均带权周转时间: %.2f ...n作业结束..", ave_aroundTime*1.0/order, ave_prior_aroundTime/order);
96 
97     return 0;
98 } 

图片 14

上边只摘录相比根本的字段:

 三.  制表键自动补全  

    当命令字符太长,很轻松输错命令。能够应用tab键自动补全。举例关机命令shutdown。能够按下shut按tab来补全,文件目录太长用法也是同样。自动补全在于要给shell丰富的消息,使其与别的名字分别。

    借使按下tab不能够补全,能够再按一下tab,将显得以输入指令起头的公文名,举例输入sh, 按一下tab未有效果与利益,再按一下tab,将展现sh开始的保有新闻。
        图片 15

 1 // MyOverlay.h : Declaration of the CMyOverlay
 2 
 3 #pragma once
 4 #include "resource.h"       // main symbols
 5 
 6 
 7 
 8 #include "Example_i.h"
 9 #include <ShlObj.h>
10 
11 
12 
13 #if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
14 #error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
15 #endif
16 
17 using namespace ATL;
18 
19 
20 // CMyOverlay
21 
22 class ATL_NO_VTABLE CMyOverlay :
23     public CComObjectRootEx<CComSingleThreadModel>,
24     public CComCoClass<CMyOverlay, &CLSID_MyOverlay>,
25     public IDispatchImpl<IMyOverlay, &IID_IMyOverlay, &LIBID_ExampleLib, 
26     /*wMajor =*/ 1, /*wMinor =*/ 0>,
27     public IShellIconOverlayIdentifier
28 {
29 public:
30     CMyOverlay()
31     {
32     }
33 
34 DECLARE_REGISTRY_RESOURCEID(IDR_MYOVERLAY)
35 
36 
37 BEGIN_COM_MAP(CMyOverlay)
38     COM_INTERFACE_ENTRY(IMyOverlay)
39     COM_INTERFACE_ENTRY(IDispatch)
40     COM_INTERFACE_ENTRY(IShellIconOverlayIdentifier)
41 END_COM_MAP()
42 
43 
44 
45     DECLARE_PROTECT_FINAL_CONSTRUCT()
46 
47 
48     HRESULT FinalConstruct()
49     {
50         return S_OK;
51     }
52 
53     void FinalRelease()
54     {
55     }
56 
57 public:
58     STDMETHOD(IsMemberOf)(THIS_ _In_ PCWSTR pwszPath, DWORD dwAttrib);
59     STDMETHOD(GetOverlayInfo)(THIS_ _Out_writes_(cchMax) PWSTR pwszIconFile,
60         int cchMax, _Out_ int * pIndex, _Out_ DWORD * pdwFlags);
61     STDMETHOD(GetPriority)(THIS_ _Out_ int * pIPriority);
62 
63 };
64 
65 OBJECT_ENTRY_AUTO(__uuidof(MyOverlay), CMyOverlay)

 

图片 16

typedef struct _IMAGE_IMPORT_DESCRIPTOR {
    union {
        DWORD   Characteristics;            // 0 for terminating null import descriptor
        DWORD   OriginalFirstThunk;         // RVA to original unbound IAT (PIMAGE_THUNK_DATA)
    } DUMMYUNIONNAME;
    DWORD   TimeDateStamp;                  // 0 if not bound,
                                            // -1 if bound, and real datetime stamp
                                            // in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
                                            // O.W. date/time stamp of DLL bound to (Old BIND)

    DWORD   ForwarderChain;                 // -1 if no forwarders
    DWORD   Name;
    DWORD   FirstThunk;                     // RVA to IAT (if bound this IAT has actual addresses)
} IMAGE_IMPORT_DESCRIPTOR;
typedef IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;

 

  早先,用vector存款和储蓄提交的作业结构体指针,本身安装叁个系统时间,终归模拟相当小概时间流速一毛一样,接下去便是毫不手艺含量的选项了,关于测量试验数据,想了想好难输,还得自身编,于是用随便函数产生多少;再在主函数参数中提供一个传递生成数据数量的参数。

好了,以后能够动用自定义形状来画我们的拓扑了,看看不难的机能呢:

OriginalFirstThunk

它指向first thunk,IMAGE_THUNK_DATA,该 thunk 拥有 Hint 和 Function name 的地址。

图片 17

1 int main(int argc, char** argv){ ////argc为参数个数, argv为接下来传的参数
2     ...
3     return 0;
4 }

 

FirstThunk

操作系统高响应比优先模拟算法,创设文件touch。它包括由IMAGE_THUNK_DATA定义的 first thunk数组的虚地址,通过loader用函数虚地址开始化thunk。

在Orignal First Thunk缺席下,它指向first thunk:Hints和The Function names的thunks。

 

上面来讲授下OriginalFirstThunk和FirstThunk。就个人领悟来说:

1. 在文书中时,他们都分别针对一个福特ExplorerVA地址。这一个地方调换来文件中,分别对应七个以 IMAGE_THUNK_DATA 为因素的的数组,这七个数组是以三个填写为 0 的IMAGE_THUNK_DATA作为实现标记符。尽管她们那五个表地点差别,但骨子里内容是一模二样的。此时,各种IMAGE_THUNK_DATA 成分指向的是贰个笔录了函数名和绝对应的DLL文件名的 IMAGE_IMPORT_BY_NAME结构体。

  1. 干什么会有七个一律的数组呢?是有来头的:

OriginalFirstThunk 指向的数组经常可以称作  hint-name table,即 HNT ,他在 PE 加载到内部存款和储蓄器中时被保留了下去且永世不会被修改。然而在 Windows 加载过 PE 到内部存款和储蓄器之后,Windows 会重写 FirstThunk 所指向的数组成分中的内容,使得数组中每种 IMAGE_THUNK_DATA 不再代表针对带有函数描述的 IMAGE_THUNK_DATA 元素,而是直接针对了函数地址。此时,FirstThunk 所指向的数组就称为输入地址表(Import Address Table ,即平常说的 IAT)。

重写前:

图片 18

重写后:

 图片 19

(以上两张图纸源于:)

typedef struct _IMAGE_THUNK_DATA32 {
    union {
        DWORD ForwarderString;      // PBYTE  指向一个转向者字符串的RVA
        DWORD Function;             // PDWORD 被输入的函数的内存地址
         DWORD Ordinal;              // 被输入的 API 的序数值
         DWORD AddressOfData;        // PIMAGE_IMPORT_BY_NAME   指向 IMAGE_IMPORT_BY_NAME
    } u1;
} IMAGE_THUNK_DATA32;
typedef IMAGE_THUNK_DATA32 * PIMAGE_THUNK_DATA32;

根据 _IMAGE_THUNK_DATA32 所指设想地址转到文件地方能够收获实质上的 _IMAGE_IMPORT_BY_NAME 数据

typedef struct _IMAGE_IMPORT_BY_NAME {
    WORD   Hint;     // 序号 

    CHAR   Name[1];  // 实际上是一个可变长的以0为结尾的字符串

} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;

 

举个例子说有程序:

图片 20

文字版:

#include <windows.h>
int WINAPI WinMain(_In_ HINSTANCE hInstance, 
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPSTR lpCmdLine,
    _In_ int nShowCmd)
{
    MessageBoxA(0, "hello", "my message", MB_OK);
    SetWindowTextA(0, "Si Wang");

    return 0;
}

此程序行使了多个 Windows API : MessageBoxA 和 SetWindowTextA

编写翻译得到程序(为简化表明,区段地点由软件计算出):

图片 21

图片 22

我们试着寻找 MessageBoxA。首先深入分析 PE 头文件,找到导出表在文件中的地方:

图片 23

输入表地点在 .rdata 区段内, 0x2264 – 0x两千 = 0x0264 得到偏移量。加上文件地点 0x0E00 获得实质上文件偏移量(0x0E00 + 0x264 = 0x1064):0x1064。

接下去翻看 0x1064 处:

图片 24

能够收获八个 DLL 的汇报,最终二个_IMAGE_IMPORT_DESCGL450IPTO大切诺基以0填充表示甘休:

那么一旦二个个查看各个DLL对应的多寡就能够找到,但是在此之前小编把装有的数据都看了下,在率先个DLL中

依靠第八个DLL描述的 OriginalFirstThunk 的 0x2350 调换能够领略,_IMAGE_THUNK_DATA32 在文书的 0x1150处,FirstThunk 指向的数量一致:

图片 25

于是就得到了文件中的 MessageBoxA 的新闻。

谈到底,在内部存款和储蓄器中 FirstThunk 所指地方上的_IMAGE_THUNK_DATA32 数组被 Windows 加载后被重写后就成了典故中的 IAT ,Import Address Table,输入地址表。使用 OllyDbg 查看运营时意况:

图片 26

4、加多完毕后提议 Build 一下 Project,MIDL compiler 将依据 .idl 文件生成 IIDs and CLSIDs。

举例说在指令行中调用该函数,***.exe 100,此时有多个参数,一个为"***.exe", 另三个正是"100"了,分别在argv[0]和argv[1]中。

此时大家就能意识形状栏重新展现了,后一次打开新文件形状栏也会暗中认可展现了。

5、切换来新增添 Class 的 .h 文件中,使其接二连三接口 IShellIconOverlayIdentifier。

  关于须要中的周转时间、带权周转时间、平均运营时间和平均带权周转时间:

 

图片 27

本文由美高梅4688am发布于美高梅4688am,转载请注明出处:操作系统高响应比优先模拟算法,创设文件touc

关键词: